﻿2026-05-10T14:48:56.1933859Z ##[group]Run pnpm verify:phase-5
2026-05-10T14:48:56.1934192Z [36;1mpnpm verify:phase-5[0m
2026-05-10T14:48:56.1955606Z shell: /usr/bin/bash -e {0}
2026-05-10T14:48:56.1955872Z env:
2026-05-10T14:48:56.1956125Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T14:48:56.1956462Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T14:48:56.1956697Z   SKIP_TRACE_CHECK: 1
2026-05-10T14:48:56.1956917Z ##[endgroup]
2026-05-10T14:48:56.5110037Z 
2026-05-10T14:48:56.5111207Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T14:48:56.5112344Z > node scripts/verify-phase-5.mjs
2026-05-10T14:48:56.5113043Z 
2026-05-10T14:48:56.5430585Z 
2026-05-10T14:48:56.5431657Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T14:48:56.5432582Z >>> pnpm verify:phase-4
2026-05-10T14:48:56.8518009Z 
2026-05-10T14:48:56.8519344Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T14:48:56.8520700Z > node scripts/verify-phase-4.mjs
2026-05-10T14:48:56.8521346Z 
2026-05-10T14:48:56.8814328Z 
2026-05-10T14:48:56.8815161Z === Workspace: typecheck ===
2026-05-10T14:48:56.8816148Z >>> pnpm -r typecheck
2026-05-10T14:48:57.2069166Z Scope: 5 of 6 workspace projects
2026-05-10T14:48:57.2124997Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:48:57.2134556Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:48:59.8259029Z packages/game-logic typecheck: Done
2026-05-10T14:48:59.8325360Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:49:02.2692563Z packages/db typecheck: Done
2026-05-10T14:49:03.4067262Z packages/protocol typecheck: Done
2026-05-10T14:49:03.4074128Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:49:03.4077271Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:49:14.4589466Z apps/client typecheck: Done
2026-05-10T14:49:15.3927710Z apps/server typecheck: Done
2026-05-10T14:49:15.4029367Z 
2026-05-10T14:49:15.4030015Z === Lint: protocol-sync ===
2026-05-10T14:49:15.4030832Z >>> pnpm lint:protocol-sync
2026-05-10T14:49:15.7099176Z 
2026-05-10T14:49:15.7100219Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T14:49:15.7101642Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T14:49:15.7102337Z 
2026-05-10T14:49:15.7389149Z lint-protocol-sync: OK
2026-05-10T14:49:15.7509182Z 
2026-05-10T14:49:15.7509561Z === Lint: game-logic-purity ===
2026-05-10T14:49:15.7510132Z >>> pnpm lint:game-logic-purity
2026-05-10T14:49:16.0558934Z 
2026-05-10T14:49:16.0560064Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T14:49:16.0561330Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T14:49:16.0562015Z 
2026-05-10T14:49:16.0867484Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T14:49:16.0980343Z 
2026-05-10T14:49:16.0980929Z === Lint: better-auth-schema-sync ===
2026-05-10T14:49:16.0981841Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T14:49:16.4023184Z 
2026-05-10T14:49:16.4024352Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:49:16.4025874Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T14:49:16.4026634Z 
2026-05-10T14:49:17.8884245Z lint-better-auth-schema-sync: OK
2026-05-10T14:49:17.9008892Z 
2026-05-10T14:49:17.9009711Z === Lint: rate-limit-budgets ===
2026-05-10T14:49:17.9010605Z >>> pnpm lint:rate-limit-budgets
2026-05-10T14:49:18.2044711Z 
2026-05-10T14:49:18.2045794Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T14:49:18.2047736Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T14:49:18.2048703Z 
2026-05-10T14:49:18.2345185Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T14:49:18.2469731Z 
2026-05-10T14:49:18.2474036Z === Lint: no-clipboard-rce ===
2026-05-10T14:49:18.2474837Z >>> pnpm lint:no-clipboard-rce
2026-05-10T14:49:18.5508934Z 
2026-05-10T14:49:18.5509964Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T14:49:18.5511100Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T14:49:18.5511824Z 
2026-05-10T14:49:18.5838211Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T14:49:18.5958874Z 
2026-05-10T14:49:18.5959378Z === Lint: room-layout ===
2026-05-10T14:49:18.5960076Z >>> pnpm lint:room-layout
2026-05-10T14:49:18.8974838Z 
2026-05-10T14:49:18.8975725Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T14:49:18.8976406Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T14:49:18.8976634Z 
2026-05-10T14:49:18.9328754Z lint-room-layout: OK
2026-05-10T14:49:18.9449441Z 
2026-05-10T14:49:18.9453719Z === ADR 0004 lint ===
2026-05-10T14:49:18.9454395Z >>> pnpm lint:adr:0004
2026-05-10T14:49:19.2482276Z 
2026-05-10T14:49:19.2483300Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T14:49:19.2484847Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T14:49:19.2485805Z 
2026-05-10T14:49:19.2783760Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:49:19.2903565Z 
2026-05-10T14:49:19.2904160Z === Drizzle: emit-check ===
2026-05-10T14:49:19.2904992Z >>> pnpm db:emit-check
2026-05-10T14:49:19.5971359Z 
2026-05-10T14:49:19.5972004Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T14:49:19.5973532Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T14:49:19.5974593Z 
2026-05-10T14:49:20.0531948Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T14:49:20.0534220Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T14:49:20.4217370Z 8 tables
2026-05-10T14:49:20.4218170Z accounts 8 columns 1 indexes 0 fks
2026-05-10T14:49:20.4219493Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T14:49:20.4220458Z characters 9 columns 0 indexes 1 fks
2026-05-10T14:49:20.4221355Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T14:49:20.4222298Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T14:49:20.4223171Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T14:49:20.4224099Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T14:49:20.4224992Z sessions 5 columns 0 indexes 1 fks
2026-05-10T14:49:20.4225553Z 
2026-05-10T14:49:20.4226411Z No schema changes, nothing to migrate 😴
2026-05-10T14:49:20.5236585Z 
2026-05-10T14:49:20.5237373Z === Drizzle: schema-sync ===
2026-05-10T14:49:20.5238196Z >>> pnpm lint:schema-sync
2026-05-10T14:49:20.8496803Z 
2026-05-10T14:49:20.8497823Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:49:20.8501699Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T14:49:20.8504333Z 
2026-05-10T14:49:20.8763795Z OK
2026-05-10T14:49:20.8889141Z 
2026-05-10T14:49:20.8889770Z === Drizzle: source-comments ===
2026-05-10T14:49:20.8893754Z >>> pnpm lint:source-comments
2026-05-10T14:49:21.1975188Z 
2026-05-10T14:49:21.1976258Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T14:49:21.1977523Z > pnpm -C packages/db run lint:source-comments
2026-05-10T14:49:21.1978925Z 
2026-05-10T14:49:21.5219404Z 
2026-05-10T14:49:21.5220572Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T14:49:21.5221883Z > node scripts/check-source-comments.mjs
2026-05-10T14:49:21.5222522Z 
2026-05-10T14:49:21.5552964Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T14:49:21.5769190Z 
2026-05-10T14:49:21.5770061Z === Workspace: test ===
2026-05-10T14:49:21.5770746Z >>> pnpm -r test
2026-05-10T14:49:21.8837264Z Scope: 5 of 6 workspace projects
2026-05-10T14:49:21.8893401Z packages/db test$ vitest run
2026-05-10T14:49:21.8902338Z packages/game-logic test$ vitest run
2026-05-10T14:49:22.3909598Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:49:22.4250351Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:49:22.7720606Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-10T14:49:23.0457154Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:49:23.3071234Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:23.3841344Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:49:23.5200866Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:23.5203229Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:49:23.5205558Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:49:23.5207289Z packages/game-logic test: [2m   Start at [22m 14:49:22
2026-05-10T14:49:23.5210126Z packages/game-logic test: [2m   Duration [22m 1.08s[2m (transform 143ms, setup 0ms, import 243ms, tests 56ms, environment 1ms)[22m
2026-05-10T14:49:23.5619862Z packages/game-logic test: Done
2026-05-10T14:49:23.5620888Z packages/protocol test$ vitest run
2026-05-10T14:49:24.0924287Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:49:24.2481083Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:24.4760632Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T14:49:24.5414207Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:49:24.5416563Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:49:24.5419180Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:49:24.5420804Z packages/db test: [2m   Start at [22m 14:49:22
2026-05-10T14:49:24.5422993Z packages/db test: [2m   Duration [22m 2.14s[2m (transform 165ms, setup 0ms, import 1.44s, tests 32ms, environment 0ms)[22m
2026-05-10T14:49:24.5629715Z packages/db test: Done
2026-05-10T14:49:24.6630940Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:49:24.8268518Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:49:24.9755125Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:49:24.9990061Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:49:25.0054349Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:49:25.0057940Z packages/protocol test: [2m   Start at [22m 14:49:24
2026-05-10T14:49:25.0071301Z packages/protocol test: [2m   Duration [22m 905ms[2m (transform 131ms, setup 0ms, import 248ms, tests 39ms, environment 0ms)[22m
2026-05-10T14:49:25.0134544Z packages/protocol test: Done
2026-05-10T14:49:25.0141236Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:49:25.0144077Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:49:25.5518134Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:49:25.6354912Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:49:26.5890876Z apps/server test: {"level":30,"time":1778424566584,"pid":4376,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:49:26.5956777Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 746[2mms[22m[39m
2026-05-10T14:49:26.5964519Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 579[2mms[22m[39m
2026-05-10T14:49:27.2233112Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:49:27.2268186Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:49:27.2387818Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 150[2mms[22m[39m
2026-05-10T14:49:27.7490532Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 51[2mms[22m[39m
2026-05-10T14:49:28.4467477Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 128[2mms[22m[39m
2026-05-10T14:49:28.6798750Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:49:28.6809835Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-fPw1UI/rebno.db
2026-05-10T14:49:28.6829685Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:49:28.6843180Z apps/server test: [run-migrations] OK
2026-05-10T14:49:28.6944015Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:49:28.6947636Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LRspTF/rebno.db
2026-05-10T14:49:28.6951996Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:49:28.6954924Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:49:28.6956718Z apps/server test: [run-migrations] OK
2026-05-10T14:49:28.7030333Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:49:28.7032660Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-l8TU0e/rebno.db
2026-05-10T14:49:28.7051529Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:49:28.7060244Z apps/server test: [run-migrations] OK
2026-05-10T14:49:28.7062634Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:49:28.7071218Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-l8TU0e/rebno.db
2026-05-10T14:49:28.7090054Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:49:28.7109136Z apps/server test: [run-migrations] OK
2026-05-10T14:49:28.7162784Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 51[2mms[22m[39m
2026-05-10T14:49:29.0800269Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T14:49:29.3858060Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 29[2mms[22m[39m
2026-05-10T14:49:29.6430033Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-10T14:49:29.6792773Z apps/server test: {"level":40,"time":1778424569675,"pid":4481,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:49:29.6876292Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T14:49:29.6882932Z apps/server test: {"level":40,"time":1778424569678,"pid":4481,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:49:29.6885345Z apps/server test: {"level":40,"time":1778424569679,"pid":4481,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:49:29.9671966Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:49:30.1992488Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:49:30.4389616Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:49:30.9825546Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 146[2mms[22m[39m
2026-05-10T14:49:31.2335384Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:49:31.2348130Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-10T14:49:31.2354524Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:49:31.9872484Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:32.1034011Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 39[2mms[22m[39m
2026-05-10T14:49:32.2353604Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:32.2435684Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:49:32.2459065Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:49:32.2468745Z apps/server test: [2m   Start at [22m 14:49:25
2026-05-10T14:49:32.2480442Z apps/server test: [2m   Duration [22m 6.68s[2m (transform 419ms, setup 0ms, import 3.28s, tests 963ms, environment 2ms)[22m
2026-05-10T14:49:32.2999876Z apps/server test: Done
2026-05-10T14:49:32.8704607Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:49:33.5663714Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:49:34.3170620Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:49:34.9875339Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:49:35.6471660Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:49:36.3023067Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:49:36.9880481Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:49:37.6503232Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:49:38.3120762Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:49:38.9601078Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:49:39.6435395Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:49:39.6653982Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:49:39.6658863Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:49:39.6662268Z apps/client test: [2m   Start at [22m 14:49:25
2026-05-10T14:49:39.6664417Z apps/client test: [2m   Duration [22m 14.05s[2m (transform 544ms, setup 55ms, collect 829ms, tests 686ms, environment 8.08s, prepare 1.63s)[22m
2026-05-10T14:49:39.7990071Z apps/client test: Done
2026-05-10T14:49:39.8082131Z 
2026-05-10T14:49:39.8085270Z verify-phase-4: OK (12 steps green)
2026-05-10T14:49:39.8198879Z 
2026-05-10T14:49:39.8199571Z === Workspace: typecheck ===
2026-05-10T14:49:39.8200789Z >>> pnpm -r typecheck
2026-05-10T14:49:40.1426031Z Scope: 5 of 6 workspace projects
2026-05-10T14:49:40.1482451Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:49:40.1491418Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:49:42.7439894Z packages/game-logic typecheck: Done
2026-05-10T14:49:42.7451210Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:49:44.9769420Z packages/db typecheck: Done
2026-05-10T14:49:46.2036487Z packages/protocol typecheck: Done
2026-05-10T14:49:46.2044273Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:49:46.2047387Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:49:56.8339645Z apps/client typecheck: Done
2026-05-10T14:49:57.9986173Z apps/server typecheck: Done
2026-05-10T14:49:58.0079794Z 
2026-05-10T14:49:58.0080327Z === Lint: deploy-stack ===
2026-05-10T14:49:58.0081267Z >>> pnpm lint:deploy-stack
2026-05-10T14:49:58.3118742Z 
2026-05-10T14:49:58.3119825Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T14:49:58.3121042Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T14:49:58.3121689Z 
2026-05-10T14:49:58.3434870Z lint-deploy-stack: OK
2026-05-10T14:49:58.3552372Z 
2026-05-10T14:49:58.3552915Z === Lint: deploy-stack test ===
2026-05-10T14:49:58.3553758Z >>> pnpm lint:deploy-stack:test
2026-05-10T14:49:58.6570463Z 
2026-05-10T14:49:58.6571694Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-10T14:49:58.6575645Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-10T14:49:58.6576499Z 
2026-05-10T14:49:58.7199100Z PASS: lint-deploy-stack green
2026-05-10T14:49:58.7330491Z 
2026-05-10T14:49:58.7339133Z === ADR 0005 lint ===
2026-05-10T14:49:58.7339648Z >>> pnpm lint:adr:0005
2026-05-10T14:49:59.0326319Z 
2026-05-10T14:49:59.0327373Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-10T14:49:59.0329345Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-10T14:49:59.0330364Z 
2026-05-10T14:49:59.0632010Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:49:59.0758826Z 
2026-05-10T14:49:59.0759256Z === ADR 0006 lint ===
2026-05-10T14:49:59.0759942Z >>> pnpm lint:adr:0006
2026-05-10T14:49:59.3829222Z 
2026-05-10T14:49:59.3830279Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-10T14:49:59.3831834Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-10T14:49:59.3833010Z 
2026-05-10T14:49:59.4125317Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:49:59.4248745Z 
2026-05-10T14:49:59.4249497Z === Workspace: test ===
2026-05-10T14:49:59.4250780Z >>> pnpm -r test
2026-05-10T14:49:59.7351913Z Scope: 5 of 6 workspace projects
2026-05-10T14:49:59.7429056Z packages/db test$ vitest run
2026-05-10T14:49:59.7429736Z packages/game-logic test$ vitest run
2026-05-10T14:50:00.2600568Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:50:00.2610118Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:50:00.5910583Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T14:50:00.8661032Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:50:01.0990564Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:50:01.2548059Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:50:01.3394091Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:50:01.3490219Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:50:01.3509739Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:50:01.3529429Z packages/game-logic test: [2m   Start at [22m 14:50:00
2026-05-10T14:50:01.3540056Z packages/game-logic test: [2m   Duration [22m 1.08s[2m (transform 117ms, setup 0ms, import 202ms, tests 46ms, environment 1ms)[22m
2026-05-10T14:50:01.3920151Z packages/game-logic test: Done
2026-05-10T14:50:01.3939100Z packages/protocol test$ vitest run
2026-05-10T14:50:01.4785320Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:50:01.9814434Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:50:02.4067754Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T14:50:02.4546206Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:50:02.4639724Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:50:02.4641499Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:50:02.4679242Z packages/db test: [2m   Start at [22m 14:50:00
2026-05-10T14:50:02.4710336Z packages/db test: [2m   Duration [22m 2.19s[2m (transform 172ms, setup 0ms, import 1.47s, tests 30ms, environment 1ms)[22m
2026-05-10T14:50:02.5039787Z packages/db test: Done
2026-05-10T14:50:02.6103717Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:50:02.7784667Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:50:02.9490800Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:50:02.9525616Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:50:02.9533601Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:50:02.9534819Z packages/protocol test: [2m   Start at [22m 14:50:01
2026-05-10T14:50:02.9536391Z packages/protocol test: [2m   Duration [22m 963ms[2m (transform 146ms, setup 0ms, import 273ms, tests 38ms, environment 0ms)[22m
2026-05-10T14:50:02.9843047Z packages/protocol test: Done
2026-05-10T14:50:02.9848119Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:50:02.9852153Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:50:03.5420361Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:50:03.6040614Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:50:04.5920481Z apps/server test: {"level":30,"time":1778424604588,"pid":5240,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:50:04.5989944Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 740[2mms[22m[39m
2026-05-10T14:50:04.5999852Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 583[2mms[22m[39m
2026-05-10T14:50:05.2381051Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:50:05.2389796Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:50:05.2587456Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 147[2mms[22m[39m
2026-05-10T14:50:05.6761444Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:50:05.6777147Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-eDkJj0/rebno.db
2026-05-10T14:50:05.6790384Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:50:05.6809101Z apps/server test: [run-migrations] OK
2026-05-10T14:50:05.6899740Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:50:05.6903328Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-veE2Lx/rebno.db
2026-05-10T14:50:05.6930212Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:50:05.6944735Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:50:05.6947009Z apps/server test: [run-migrations] OK
2026-05-10T14:50:05.7050135Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:50:05.7069860Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OyaIaS/rebno.db
2026-05-10T14:50:05.7082374Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:50:05.7094169Z apps/server test: [run-migrations] OK
2026-05-10T14:50:05.7130025Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:50:05.7139614Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OyaIaS/rebno.db
2026-05-10T14:50:05.7142177Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:50:05.7143283Z apps/server test: [run-migrations] OK
2026-05-10T14:50:05.7144661Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 55[2mms[22m[39m
2026-05-10T14:50:06.4027920Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 102[2mms[22m[39m
2026-05-10T14:50:06.7984871Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 57[2mms[22m[39m
2026-05-10T14:50:07.0660330Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:50:07.3327098Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T14:50:07.5817208Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:50:07.6415171Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-10T14:50:07.8600251Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:50:08.1632739Z apps/server test: {"level":40,"time":1778424608155,"pid":5382,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:50:08.1689446Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:50:08.1712945Z apps/server test: {"level":40,"time":1778424608159,"pid":5382,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:50:08.1741314Z apps/server test: {"level":40,"time":1778424608160,"pid":5382,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:50:08.4337497Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:50:08.6633464Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:50:08.9200658Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 144[2mms[22m[39m
2026-05-10T14:50:09.4776600Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:50:09.4787789Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-10T14:50:09.4825868Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:50:10.0487786Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-10T14:50:10.2448782Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:50:10.2529853Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:50:10.2560699Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:50:10.2599185Z apps/server test: [2m   Start at [22m 14:50:03
2026-05-10T14:50:10.2616394Z apps/server test: [2m   Duration [22m 6.70s[2m (transform 455ms, setup 0ms, import 3.36s, tests 958ms, environment 2ms)[22m
2026-05-10T14:50:10.3015043Z apps/server test: Done
2026-05-10T14:50:10.8098085Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:50:11.5946620Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:50:12.2766259Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:50:12.9343005Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:50:13.6093186Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:50:14.2647703Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:50:14.9488839Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:50:15.6085188Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:50:16.2714163Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:50:16.9359816Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:50:17.6012012Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:50:17.6210150Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:50:17.6231130Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:50:17.6259145Z apps/client test: [2m   Start at [22m 14:50:03
2026-05-10T14:50:17.6276205Z apps/client test: [2m   Duration [22m 14.02s[2m (transform 484ms, setup 44ms, collect 776ms, tests 626ms, environment 8.08s, prepare 1.64s)[22m
2026-05-10T14:50:17.7557763Z apps/client test: Done
2026-05-10T14:50:17.7643676Z 
2026-05-10T14:50:17.7644252Z verify-phase-5: OK (7 steps green)
